#include "atomic_0828_feature_extraction_service.h"

int getFeatureExtract(FeatureExtractInput *input, FeatureExtractOutput *output)
{
    // 检查输入输出指针有效性
    if (input == nullptr || output == nullptr)
    {
        return ATOMIC_SERVICE_ERROR;
    }

    // 初始化输出结构体
    memset(output, 0, sizeof(FeatureExtractOutput));

    // 检查输入数据有效性
    if (input->is_valid != 1)
    {
        output->return_type = ATOMIC_SERVICE_FAIL;
        return ATOMIC_SERVICE_FAIL;
    }

    // 检查图像尺寸有效性
    if (input->proc_width <= 0 || input->proc_height <= 0)
    {
        output->return_type = ATOMIC_SERVICE_ERROR;
        return ATOMIC_SERVICE_ERROR;
    }

    // 检查像素值范围有效性
    if (input->pixel_min < 0 || input->pixel_min > 255 ||
        input->pixel_max < 0 || input->pixel_max > 255 ||
        input->pixel_min > input->pixel_max)
    {
        output->return_type = ATOMIC_SERVICE_ERROR;
        return ATOMIC_SERVICE_ERROR;
    }

    // 提取特征计算
    // 1. 特征数量：固定为2（边缘特征+纹理特征）
    output->feature_count = 2;

    // 2. 边缘强度计算：基于像素值范围映射（0-255 -> 0-100）
    int pixel_range = input->pixel_max - input->pixel_min;
    output->edge_strength = static_cast<int>((static_cast<float>(pixel_range) / 255.0f) * 100.0f);
    output->edge_strength = (output->edge_strength > 100) ? 100 : output->edge_strength;

    // 3. 纹理评分计算：基于图像尺寸复杂度映射
    int img_area = input->proc_width * input->proc_height;
    // 假设最大有效面积为1000000，超过此值按最大值计算
    const int MAX_AREA = 1000000;
    img_area = (img_area > MAX_AREA) ? MAX_AREA : img_area;
    output->texture_score = static_cast<int>((static_cast<float>(img_area) / MAX_AREA) * 100.0f);

    // 4. 图像尺寸信息传递
    output->img_width = input->proc_width;
    output->img_height = input->proc_height;

    // 5. 设置成功状态
    output->return_type = ATOMIC_SERVICE_SUCCESS;

    return ATOMIC_SERVICE_SUCCESS;
}